<?php
namespace app\shop\controller;

use think\Controller;

class Product extends Controller
{
    public function __construct()
    {
        parent::__construct();

        $this->ProductModel = model('Product.Product');
        $this->TypeModel = model('Product.Type');
        $this->CartModel = model('Product.Cart');
        $this->BusinessModel = model('Business.Business');
        $this->OrderProductModel = model('Order.Product');
        $this->RelationModel = model('Product.Attribute.Relation');
        $this->AttributeModel = model('Product.Attribute.Attribute');
        $this->CollectionModel = model('Business.Collection');
    }
    // 请求分类列表
    public function type()
    {
        if($this->request->isPost())
        {
            $list = $this->TypeModel->select();

            if($list)
            {
                $this->success('分类列表', null, $list);
                exit;
            }else
            {
                $this->error('暂无分类');
                exit;
            }
        }
    }

    //商品数据列表
    public function index()
    {
        if($this->request->isPost())
        {
            $page = $this->request->param('page', 1, 'trim');
            $typeid = $this->request->param('typeid', 0, 'trim');
            $flag = $this->request->param('flag', '0', 'trim');
            $sort = $this->request->param('sort', 'createtime', 'trim');
            $by = $this->request->param('by', 'desc', 'trim');
            $keywords = $this->request->param('keywords', '', 'trim');
            $limit = 8;

            //偏移量
            $offset = ($page-1)*$limit;

            //查询分类名称
            $TypeName = $this->TypeModel->where(['id' => $typeid])->value('name');
            $TypeName = empty($TypeName) ? '全部分类' : $TypeName;
            
            $where = [];

            //关键词不为空
            if(!empty($keywords))
            {
                $where['name'] = ['like', "%$keywords%"];
            }

            //分类筛选
            if($typeid)
            {
                $where['typeid'] = $typeid;
            }

            //标签筛选
            if($flag != "0")
            {
                $where['flag'] = $flag;
            }

            $list = $this->ProductModel
                ->where($where)
                ->order($sort, $by)
                ->limit($offset, $limit)
                ->select();

            $data = [
                'TypeName' => $TypeName,
                'list' => $list
            ];

            if($list)
            {
                $this->success('返回商品数据', null, $data);
                exit;
            }else
            {
                $this->error('暂无更多商品数据');
                exit;
            }
        }
    }

    //商品详情
    public function info()
    {
        if($this->request->isPost())
        {
            $proid = $this->request->param('proid', 0, 'trim');
            $busid = $this->request->param('busid', 0, 'trim');

            $product = $this->ProductModel->with(['type','unit'])->find($proid);

            if(!$product)
            {
                $this->error('商品不存在');
                exit;
            }

            //判断如果有用户信息就查询是否有收藏过
            $business = $this->BusinessModel->find($busid);

            // 这里是判断是否有登录。如果有登录，就进行一系列操作，例如查询收藏，查询购物车的数量；如果没有登录，就显示未收藏，购物车数量为0
            // 这里的显示的效果，在vue-shop\src\components\product\info.vue页面的底部导航栏的标签那里写，v-if="product.cart"和v-else ，v-if="product.collection"和v-else
            if($business)
            {
                $where = ['collectid'=>$proid, 'busid' => $busid, 'status'=>'product'];
                $product['collection'] = $this->CollectionModel->where($where)->find() ? true : false;

                //要去找出这个人的购物车数量
                $product['cart'] = $this->CartModel->where(['busid'=>$busid])->sum('nums');
            }else
            {
                //没有登录的话，直接就是未收藏  
                $product['collection'] = false;

                //如果没有登录 购物车的数量 就是0个。 
                /* 作用是将一个数组元素的值设置为0。检查数组 $product：如果 $product 不存在或不是一个数组，PHP会自动将其转换为数组。
                设置键值对：将键 'cart' 对应的值设置为0。如果 'cart' 键之前不存在于数组中，则会创建这个键并赋值为0；如果 'cart' 键已经存在，则会更新其值为*/
                $product['cart'] = 0;
            }





            // 要知道评论的用户是谁，就连表查询，根据business外键id，
            $comment = $this->OrderProductModel->with(['business'])->where(['proid' => $proid])->select();


            $properties = $sku = $list = [];

            //查找商品规格属性
            /* 在fa_product_attribute_relation(模型为Product\Attribute\Relation.php)查这个商品有几个类型的规格。一次性查出来，表中的attrid字段。
            如果sql语句中在where条件下加上group（'attrid'），表示按attrid这个字段做分组查询*/
            $attrid = $this->RelationModel->where(['proid' => $proid])->group('attrid')->column('attrid');
            $attrs = $this->AttributeModel->where(['id'=> ['IN', $attrid]])->column('id,name');// ['1' => '颜色']

            // halt($attrs);

            // 组装properties
            // 等这里组装好propertise之后，往下开始往空数组'v' => []中组装，组装表fa_product_attribute_relation的value字段中的值，例如白色，给什么价格，红色，给什么价格
            if($attrs)
            {
                foreach($attrs as $key=>$item)
                {
                    $properties[$key] = [
                        'k_id' => $key, //属性ID  这个'k_id'和list的id一样
                        'k' => $item, //规格名称。中文字，用来表示是什么属性
                        'is_multiple' => false, //是否可多选
                        'v' => []
                    ];


                    /*
                        [
                            1 => [
                                'k_id' => 1,
                                'k' => '颜色',
                                'is_multiple' => false,
                                'v' => []
                            ],
                            2 => [
                                'k_id' => 2,
                                'k' => '容量大小',
                                'is_multiple' => false,
                                'v' => []
                            ]
                        ]
                     */
                }
            }






            //查找商品规格列表
            // 然后打印出来，var_dump($properties);  ，在网络那里查看它的这个商品的规格
            $relationlist = $this->RelationModel->where(['proid' => $proid])->select();

            // var_dump($relationlist); 

            //重新组装sku的数据结构
            // 有了与sku同级的properties，sku的tree属性就可以不需要了，但是不能去掉，要有这个选项，所以给个空数组结构
            // 这里之所以给空数组，是因为循环后可以装新的数据结构，如果没有循环，新的就会把前面的覆盖掉
            if($properties && $relationlist) 
            {
                foreach($relationlist as $item)
                {
                    $properties[$item['attrid']]['v'][] = [
                        'id' => $item['id'],
                        'name' => $item['value'],
                        'price' => (float)bcmul($item['price'], 100), //前端显示的是分单位
                        'text_status' => 1,
                    ];
                }

                /*
                        [
                            1 => [
                                'k_id' => 1,
                                'k' => '颜色',
                                'is_multiple' => false,
                                'v' => [
                                    [

                                    ]
                                ]
                            ],
                            2 => [
                                'k_id' => 2,
                                'k' => '容量大小',
                                'is_multiple' => false,
                                'v' => []
                            ]
                        ]
                     */
            }

            // var_dump($properties);
            // die;


            /*
            bcmul() 是 PHP 中的一个函数，用于高精度的乘法运算。它将 $product['price'] 的值乘以 100 。
            $product['price'] 表示从 $product 数组中获取名为 price 的元素的值。

            */
            // 一定要有主要的属性
            foreach($properties as $item)
            {
                $list[] = [ 
                    's1' => $item['k_id'],  //这个list的id和'k_id'一样
                    'price' => (float)bcmul($product['price'], 100), //默认的商品价格  因为这里单位是分，所以要成100
                    'stock_num' => $product['stock'], //库存
                ];
            }

            

            //组装sku
               
            // 有了与sku同级的properties，sku的tree属性就可以不需要了，但是不能去掉，要有这个选项，所以给个空数组结构。因为这里商品规格是没有图片的
            $sku = [
                'tree' =>[],
                'price' => $product['price'], //默认按照单独购买的价格来算
                'stock_num' => $product['stock'], //库存
                'list' => $list
            ];
            
            

            //返回数据结果
            // 关于商品属性，一开始进来，在前面的模块中，已经找到了商品和评论，即product和comment。此时，还缺sku和properties的信息，就要查找然后组装，最后返回到src\components\product\info.vue
            /* 然后就要去找商品的属性，对应的表为fa_product_attribute_reletion,首先找到商品的id，即proid=37的商品；然后，此商品的属性id,即attrid，
              分为1颜色，2是否支持，3多少毫升，即有三种，就要做个分组做查询，全部查出来，arrtid相同的放到一起去，引入两个表对应的模型，还有一个表为fa_product_attribute。
              然后，现在去fa_product_attribute_reletion查商品赋给$relationlist ，条件为'proid'=>$proid，在这里查出来的商品都有规格，然后打印出来，看规格
            */
            $data = [
                'product' => $product,
                'comment' => $comment,
                'sku' => $sku,
                'properties' => $properties,
            ];

            if($product)
            {
                $this->success('返回商品数据', null, $data);
                exit;
            }else
            {
                $this->error('无商品数据');
                exit;
            }

            
            // var_dump($properties);
            // die;

        }
    }

    //商品收藏
    public function collection()
    {
        if($this->request->isAjax())
        {
            $collectid = $this->request->param('collectid', 0, 'trim');
            $busid = $this->request->param('busid', 0, 'trim');
            $action = $msg = '';

            $product = $this->ProductModel->find($collectid);

            if(!$product)
            {
                $this->error('商品不存在');
                exit;
            }

            $business = $this->BusinessModel->find($busid);

            if(!$business)
            {
                $this->error('客户身份未知');
                exit;
            }

            //判断当前用户是否有收藏过该商品
            $where = [
                'busid' => $busid,
                'collectid' => $collectid,
                'status' => 'product'
            ];

            $collect = $this->CollectionModel->where($where)->find();

            if($collect)
            {
                //已收藏过,取消收藏删除
                $result = $this->CollectionModel->where(['id' => $collect['id']])->delete();

                $action = 'delete';
                $msg = '取消收藏';
            }else
            {
                //没收藏 插入语句
                $data = [
                    'collectid' => $collectid,
                    'busid' => $busid,
                    'status' => 'product'
                ];

                $result = $this->CollectionModel->validate('common/Business/Collection')->save($data);

                $action = 'add';
                $msg = "收藏";
            }

            if($result === FALSE)
            {
                $this->error("{$msg}失败");
                exit;
            }else
            {
                $this->success("{$msg}成功", null, $action);
                exit;
            }
        }
    }
}

 